#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <math.h>

#include "Bonus.h"

void initBonus (Bonus* pbonus, Ennemi* pennemi)
{
	assert (pbonus != NULL && pennemi != NULL);
	int i;
	pbonus->posX_bonus = getPosXEnnemi(pennemi);
	pbonus->posY_bonus = getPosYEnnemi(pennemi);
	srand(time(NULL));
	i= (int)rand()%10;
	if (i>0 && i<3) // Bonus vie.
	{
		pbonus->est_bonus_arme = 0;
	}
	else if (i>=3 && i<7) // Missile.
	{
		pbonus->est_bonus_arme = 1;
	}
	else  if (i==7) // Onde de choc.
	{
		pbonus->est_bonus_arme = 2;
	}
	else
	{
		pbonus = NULL;
	}
}

Bonus* creerBonus (Ennemi* pennemi)
{
	assert (pennemi != NULL);
	Bonus* pbonus = (Bonus*)(malloc(sizeof(Bonus)));
	initBonus(pbonus, pennemi);
	return pbonus;
}

void initBonusBoss (Bonus* pbonus, Boss* pboss)
{
	assert (pbonus != NULL && pboss != NULL);
	pbonus->posX_bonus = getPosXBoss(pboss);
	pbonus->posY_bonus = getPosYBoss(pboss);
	pbonus->est_bonus_arme = 3;
}

Bonus* creerBonusBoss (Boss* pboss)
{
	assert (pboss != NULL);
	Bonus* pbonus = (Bonus*)(malloc(sizeof(Bonus)));
	initBonusBoss(pbonus,pboss);
	return pbonus;
}

void detruireBonus (Bonus** ppbonus)
{
	assert (*ppbonus != NULL && ppbonus!=NULL);
	free (*ppbonus);
	*ppbonus = NULL;
}

const int getEstBonusArme (const Bonus* pbonus)
{
	assert (pbonus!=NULL);
	return pbonus->est_bonus_arme;
}

void setEstBonusArme (Bonus* pbonus, const int est_bonus)
{
	assert (pbonus!=NULL && (est_bonus==0 || est_bonus==1));
	pbonus->est_bonus_arme=est_bonus;
}

const float getPosXBonus (const Bonus* pbonus)
{
	assert (pbonus != NULL);
	return pbonus->posX_bonus;
}

void setPosXBonus (Bonus* pbonus, const float posX_bonus)
{
	assert (pbonus != NULL);
	pbonus->posX_bonus = posX_bonus;
}

const float getPosYBonus (const Bonus* pbonus)
{
	assert (pbonus != NULL);
	return pbonus->posY_bonus;
}

void setPosYBonus (Bonus* pbonus, const float posY_bonus)
{
	assert (pbonus != NULL);
	pbonus->posY_bonus = posY_bonus;
}

void bonusHeros (Heros* pheros,const Bonus* pbonus)
{
	if ((getEstBonusArme(pbonus))==0)
		setVieHeros (pheros, (getVieHeros(pheros))+10);
	else if ((getEstBonusArme(pbonus))==1)
	{
		setMunitions (pheros->parme_secondaire1,
			      (getMunitions(pheros->parme_secondaire1))+1); 
	}
	else if ((getEstBonusArme(pbonus))==2)
	{
		setMunitions (pheros->parme_secondaire2,
			      (getMunitions(pheros->parme_secondaire2))+1);
	}
}

/** @brief Cette procedure permet de tester toutes les fonctions du module*/
void testRegressionBonus ()
{
	Point* ppt1 = creerPoint (2, 4);
	Point* ppt2 = creerPoint (5, 10);
	double vit1 = 10.5;
	float posX = 5;
	float posY = 7;
	Trajectoire* ptraj = creerTrajectoire (ppt1, ppt2, vit1);
	Ennemi* pennemi = creerEnnemi (0, posX, posY, ptraj);
	Bonus* pbonus = creerBonus (pennemi);
	
	setEstBonusArme (pbonus, 1);
	if (1 == getEstBonusArme (pbonus))
		printf ("set/getEstBonusArme fonctionne \n");
	else
		printf ("set/getEstBonusArme ne fonctionne pas \n");
	
	setPosXBonus (pbonus, 15);
	if (15 == getPosXBonus(pbonus))
		printf ("set/getPosXBonus fonctionne \n");
	else
		printf ("set/getPosXBonus ne fonctionne pas \n");
	
	setPosYBonus (pbonus, 12);
	if (12 == getPosYBonus (pbonus))
		printf ("set/getPosYBonus fonctionne \n");
	else
		printf ("set/getPosYBonus ne fonctionne pas \n");
	
	detruireBonus (&pbonus);
	if (pbonus == NULL)
		printf ("Detruire fonctionne \n");
	else
		printf ("Detruire ne fonctionne pas \n");
	}
	
